home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / hardfile.c < prev    next >
C/C++ Source or Header  |  1998-01-20  |  6KB  |  260 lines

  1.  /*
  2.   * UAE - The Un*x Amiga Emulator
  3.   *
  4.   * AutoConfig devices
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "memory.h"
  15. #include "custom.h"
  16. #include "readcpu.h"
  17. #include "newcpu.h"
  18. #include "disk.h"
  19. #include "autoconf.h"
  20. #include "filesys.h"
  21. #include "execlib.h"
  22.  
  23. static int opencount = 0;
  24.  
  25. static uae_u32 hardfile_open(void)
  26. {
  27.     uaecptr tmp1 = m68k_areg(regs, 1); /* IOReq */
  28.  
  29.     /* Check unit number */
  30.     if (get_hardfile_data (m68k_dreg (regs, 0))) {
  31.     opencount++;
  32.     put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) + 1);
  33.     put_long (tmp1+24, m68k_dreg (regs, 0)); /* io_Unit */
  34.     put_byte (tmp1+31, 0); /* io_Error */
  35.     put_byte (tmp1+8, 7); /* ln_type = NT_REPLYMSG */
  36.     return 0;
  37.     }
  38.  
  39.     put_long (tmp1+20, (uae_u32)-1);
  40.     put_byte (tmp1+31, (uae_u8)-1);
  41.     return (uae_u32)-1;
  42. }
  43.  
  44. static uae_u32 hardfile_close(void)
  45. {
  46.     opencount--;
  47.     put_word (m68k_areg(regs, 6)+32, get_word (m68k_areg(regs, 6)+32) - 1);
  48.  
  49.     return 0;
  50. }
  51.  
  52. static uae_u32 hardfile_expunge(void)
  53. {
  54.     return 0; /* Simply ignore this one... */
  55. }
  56.  
  57. static uae_u32 hardfile_beginio(void)
  58. {
  59.     uae_u32 tmp1, tmp2, dataptr, offset;
  60.     uae_u32 retval = m68k_dreg(regs, 0);
  61.     int unit;
  62.     struct hardfiledata *hfd;
  63.  
  64.     tmp1 = m68k_areg(regs, 1);
  65.     unit = get_long (tmp1 + 24);
  66. #undef DEBUGME
  67. #ifdef DEBUGME
  68.     printf ("hardfile: unit = %d\n", unit);
  69.     printf ("hardfile: tmp1 = %08lx\n", (unsigned long)tmp1);
  70.     printf ("hardfile: cmd  = %d\n", (int)get_word(tmp1+28));
  71. #endif
  72.     hfd = get_hardfile_data (unit);
  73.  
  74.     put_byte (tmp1+8, NT_MESSAGE);
  75.     put_byte (tmp1+31, 0); /* no error yet */
  76.     tmp2 = get_word (tmp1+28); /* io_Command */
  77. /*    put_byte (tmp1 + 30, get_byte (tmp1 + 30) & ~1);*/
  78.     switch (tmp2) {
  79.      case CMD_READ:
  80.     dataptr = get_long (tmp1 + 40);
  81.     if (dataptr & 1)
  82.         goto bad_command;
  83.     offset = get_long (tmp1 + 44);
  84.     if (offset & 511)
  85.         goto bad_command;
  86.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  87.     if (tmp2 & 511)
  88.         goto bad_command;
  89.     if (tmp2 + offset > (uae_u32)hfd->size)
  90.         goto bad_command;
  91.  
  92.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  93.     fseek (hfd->fd, offset, SEEK_SET);
  94.     while (tmp2) {
  95.         int i;
  96.         char buffer[512];
  97.         fread (buffer, 1, 512, hfd->fd);
  98.         for (i = 0; i < 512; i++, dataptr++)
  99.         put_byte(dataptr, buffer[i]);
  100.         tmp2 -= 512;
  101.     }
  102.     break;
  103.  
  104.      case CMD_WRITE:
  105.      case 11: /* Format */
  106.     dataptr = get_long (tmp1 + 40);
  107.     if (dataptr & 1)
  108.         goto bad_command;
  109.     offset = get_long (tmp1 + 44);
  110.     if (offset & 511)
  111.         goto bad_command;
  112.     tmp2 = get_long (tmp1 + 36); /* io_Length */
  113.     if (tmp2 & 511)
  114.         goto bad_command;
  115.     if (tmp2 + offset > (uae_u32)hfd->size)
  116.         goto bad_command;
  117.  
  118.     put_long (tmp1 + 32, tmp2); /* set io_Actual */
  119.     fseek (hfd->fd, offset, SEEK_SET);
  120.     while (tmp2) {
  121.         char buffer[512];
  122.         int i;
  123.         for (i=0; i < 512; i++, dataptr++)
  124.         buffer[i] = get_byte(dataptr);
  125.         fwrite (buffer, 1, 512, hfd->fd);
  126.         tmp2 -= 512;
  127.     }
  128.     break;
  129.  
  130.     bad_command:
  131.     break;
  132.  
  133.      case 18: /* GetDriveType */
  134.     printf ("Shouldn't happen\n");
  135.     put_long (tmp1 + 32, 1); /* not exactly a 3.5" drive, but... */
  136.     break;
  137.  
  138.      case 19: /* GetNumTracks */
  139.     printf ("Shouldn't happen 2\n");
  140.     put_long (tmp1 + 32, 0);
  141.     break;
  142.  
  143.     /* Some commands that just do nothing and return zero */
  144.      case CMD_UPDATE:
  145.      case CMD_CLEAR:
  146.      case 9: /* Motor */
  147.      case 10: /* Seek */
  148.      case 12: /* Remove */
  149.      case 13: /* ChangeNum */
  150.      case 14: /* ChangeStatus */
  151.      case 15: /* ProtStatus */
  152.      case 20: /* AddChangeInt */
  153.      case 21: /* RemChangeInt */
  154.     put_long (tmp1+32, 0); /* io_Actual */
  155.     retval = 0;
  156.     break;
  157.  
  158.      default:
  159.     /* Command not understood. */
  160.     put_byte (tmp1+31, (uae_u8)-3); /* io_Error */
  161.     retval = 0;
  162.     break;
  163.     }
  164. #if 0
  165.     if ((get_byte (tmp1+30) & 1) == 0) {
  166.     /* Not IOF_QUICK -- need to ReplyMsg */
  167.     m68k_areg(regs, 1) = tmp1;
  168.     CallLib (get_long(4), -378);
  169.     }
  170. #endif
  171.     return retval;
  172. }
  173.  
  174. static uae_u32 hardfile_abortio(void)
  175. {
  176.     return (uae_u32)-3;
  177. }
  178.  
  179. void hardfile_install(void)
  180. {
  181.     uae_u32 functable, datatable, inittable;
  182.     uae_u32 initcode, openfunc, closefunc, expungefunc;
  183.     uae_u32 beginiofunc, abortiofunc;
  184.  
  185.     ROM_hardfile_resname = ds("uaehf.device");
  186.     ROM_hardfile_resid = ds("UAE hardfile.device 0.2");
  187.  
  188.     /* initcode */
  189. #if 0
  190.     initcode = here();
  191.     calltrap(deftrap(hardfile_init)); dw(RTS);
  192. #else
  193.     initcode = filesys_initcode;
  194. #endif
  195.     /* Open */
  196.     openfunc = here();
  197.     calltrap(deftrap(hardfile_open)); dw(RTS);
  198.  
  199.     /* Close */
  200.     closefunc = here();
  201.     calltrap(deftrap(hardfile_close)); dw(RTS);
  202.  
  203.     /* Expunge */
  204.     expungefunc = here();
  205.     calltrap(deftrap(hardfile_expunge)); dw(RTS);
  206.  
  207.     /* BeginIO */
  208.     beginiofunc = here();
  209.     calltrap(deftrap(hardfile_beginio));
  210.     dw (0x48E7); dw (0x8002); /* movem.l d0/a6,-(a7) */
  211.     dw (0x0829); dw (0); dw (30); /* btst #0,30(a1) */
  212.     dw (0x6608); /* bne.b +8 */
  213.     dw (0x2C78); dw (0x0004); /* move.l 4,a6 */
  214.     dw (0x4EAE); dw (-378); /* jsr ReplyMsg(a6) */
  215.     dw (0x4CDF); dw (0x4001); /* movem.l (a7)+,d0/a6 */
  216.     dw(RTS);
  217.  
  218.     /* AbortIO */
  219.     abortiofunc = here();
  220.     calltrap(deftrap(hardfile_abortio)); dw(RTS);
  221.  
  222.     /* FuncTable */
  223.     functable = here();
  224.     dl(openfunc); /* Open */
  225.     dl(closefunc); /* Close */
  226.     dl(expungefunc); /* Expunge */
  227.     dl(EXPANSION_nullfunc); /* Null */
  228.     dl(beginiofunc); /* BeginIO */
  229.     dl(abortiofunc); /* AbortIO */
  230.     dl(0xFFFFFFFFul); /* end of table */
  231.  
  232.     /* DataTable */
  233.     datatable = here();
  234.     dw(0xE000); /* INITBYTE */
  235.     dw(0x0008); /* LN_TYPE */
  236.     dw(0x0300); /* NT_DEVICE */
  237.     dw(0xC000); /* INITLONG */
  238.     dw(0x000A); /* LN_NAME */
  239.     dl(ROM_hardfile_resname);
  240.     dw(0xE000); /* INITBYTE */
  241.     dw(0x000E); /* LIB_FLAGS */
  242.     dw(0x0600); /* LIBF_SUMUSED | LIBF_CHANGED */
  243.     dw(0xD000); /* INITWORD */
  244.     dw(0x0014); /* LIB_VERSION */
  245.     dw(0x0004); /* 0.4 */
  246.     dw(0xD000);
  247.     dw(0x0016); /* LIB_REVISION */
  248.     dw(0x0000);
  249.     dw(0xC000);
  250.     dw(0x0018); /* LIB_IDSTRING */
  251.     dl(ROM_hardfile_resid);
  252.     dw(0x0000); /* end of table */
  253.  
  254.     ROM_hardfile_init = here();
  255.     dl(0x00000100); /* ??? */
  256.     dl(functable);
  257.     dl(datatable);
  258.     dl(initcode);
  259. }
  260.